package com.example.algorithm.no0020.solution;

import com.example.algorithm.no0020.Solution;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Stack;

/**
 * @Description 解答实现-有效括号-stack
 * @ClassName StackSolutionImpl
 * @Author Administrator
 * @Date 2020/5/16 12:48
 * @Version 1.0.0
 */
public class StackSolutionImpl implements Solution {

    private static final Map<Character,Character> mappings = new HashMap<Character,Character>(){{
        put('}', '{');
        put(']', '[');
        put(')', '(');
    }};

    @Override
    public boolean isValid(String s) {
        // 初始化一个栈
        Stack<Character> stack = new Stack<>();

        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);

            // 判断是否是左括号
            if (!mappings.containsKey(c)) {
                // 如果是左括号，压入栈
                stack.push(c);
            } else {
                // 如果是右括号，则弹出栈中顶部元素
                // 获取栈中顶部元素. 如果栈是空的，返回一个默认值
                char topElement = stack.empty() ? '#' : stack.pop();

                // 如果顶部元素（理论上应该是左括号）跟当前值对应的左括号对应不上，返回失败
                if (topElement != mappings.get(c)) {
                    return false;
                }
            }
        }

        // 字符串遍历结束后，栈中应该为空
        return stack.isEmpty();
    }
}
